package cn.tedu.oop;
/*本类用于测试代码块
* 普通方法3  构造方法2  构造代码块1  局部代码块4
* 分析：
* 1. 当创建对象时，会触发构造函数
* 2.  创建对象时，也会触发构造代码快，并且构造代码块优先于构造方法执行
* 3、  我们创建好对象后才能通过对象调用普通方法
* 4、  如果普通方法里有局部代码块,才会触发对应的局部代码块*/
public class TestBlock {
    public static void main(String[] args) {
        Pig p = new Pig();
        System.out.println(p.age);


        Pig p1 = new Pig("白菜",12);
        System.out.println(p1.food);
        System.out.println(p1.age);


        Pig p2 = new Pig(547);
        System.out.println(p2.age);
        p2.eat();

    }
}
//创建一个小猪类用来测试
class Pig{
//    定义属性
    String food;//食物
    int age;
//    创建本类的构造代码块
    {
    /*
    * 构造代码块：｛｝
    * 1.位置;类里方法外
    * 2. 执行时机：每次创建对象时都会执行构造代码块，并且构造块优先于构造方法执行
    * 3. 作用：用于提取所有构造方法的共性功能*/
        System.out.println("我是一个构造代码块");
        System.out.println("黑猪~");
    }

    public Pig(){
        System.out.println("这是无参构造");
    }
    public Pig(int a){
        System.out.println("这是含参构造+"+a);
    }

    public Pig(String food, int age) {
        System.out.println(food+"这是全参构造"+age);
        this.food = food;
        this.age = age;
    }

    public void eat(){
        System.out.println("小猪爱吃大白菜");
//        创建本类的局部代码块
        {
            /*
            * 局部代码块：｛｝
            * 1. 位置： 方法里
            * 2. 执行时机：调用本局部代码块所处的方法时才会执行
            * 3. 作用：用于控制变量的作用范围，变量的作用范围越小越好*/
            System.out.println("我是一个局部代码块");
            int i = 100;
            System.out.println(i);
        }
//        System.out.println(i);//局部代码块中的局部变量i只能在代码块里使用
    }
}